home *** CD-ROM | disk | FTP | other *** search
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<dos.h>
- #include<direct.h>
- #include"list.h"
- #include"chain.h"
-
- #define TRUE (-1)
- #define FALSE 0
- #define ERR (-1)
-
-
- char line[]="-------------------------------------------------------------------------------\n";
- char top[]=" NO. FILENAME SIZE DATE TIME LINE \n";
-
- extern LIST head;
- extern PARA outfile,infile;
- extern FILE *ofp;
-
-
- void LineCount(void)
- {
- int lcnt=1,cnt=0,readsize=0;
- char *t;
- LIST *p;
- FILE *fp;
-
- for(p=head.next;p!=NULL;p=p->next){
- if((fp=fopen(p->file,"r"))==NULL){
- printf("'%s' can't open.\n",p->file);
- exit(1);
- }
-
- readsize=(p->size)+2; /* +1は最後にいれる'\n'のため */
- p->bf=(char *)malloc(readsize);
- readsize=fread(p->bf,1,readsize,fp);
- p->rsize=readsize+1; /* LFを外したファイルの大きさ */
-
- t=p->bf;
- if(t==NULL) return;
- lcnt=HEADERLINE+TAILLINE; /* 注釈が3行と最後の区切り分 */
- for(cnt=0;cnt<readsize;cnt++)
- if(*t++=='\n') lcnt++;
-
- *t='\n';
- p->line=lcnt;
- fclose(fp);
- printf("o");
- }
- }
-
- /*********************************************
- file.000 ~ file.999のファイルネームを返す.
- ファイル file.000,file.001などは同時にオープン
- することはないので静的変数を使う。
- **********************************************/
- char *WriteOpenName(char *f)
- {
- static int fnum=0;
- int i,k;
- char *p;
-
- if(fnum > 999 ) return(NULL);
-
- strcpy(f,outfile.file);
-
- p=strchr(f,'\0'); /* '\0'を探す */
- *p++='.';
- for(i=100,k=fnum;i>=1;i/=10){
- *p++='0'+ k/i;
- k=k % i;
- }
- *p='\0';
- fnum++;
- return(f);
- }
-
- char *GetTimeString(unsigned short int time,char *timebuf)
- {
- char *p=timebuf;
- int i=0;
-
- i=(time&0xf800)>>11;
-
- if(i<10) *p++='0';
- else *p++='0'+ i/10;
- *p++='0'+ i%10;*p++=':';
-
- i=(time&0x07e0)>>5;
- if(i<10) *p++='0';
- else *p++='0'+i/10;
- *p++='0'+i%10;*p='\0';
- return(timebuf);
- }
- char *GetDateString(unsigned short int date,char *datebuf)
- {
- char *p=datebuf;
- int i=0;
-
- i=(date&0xfe00)>>9;
- i=(i+80)%100;
- if(i<10) *p++='0';
- else *p++='0'+ i/10;
- *p++='0'+ i%10;*p++='/';
-
- i=(date&0x01e0)>>5;
- if(i<10) *p++='0';
- else *p++='0'+i/10;
- *p++='0'+i%10;*p++='/';
-
- i=(date&0x001f);
- if(i<10) *p++='0';
- else *p++='0'+i/10;
- *p++='0'+i%10;*p='\0';
-
- return(datebuf);
- }
-
-
- /****************************************************
- lcnt(行数カウンター)の値は main 関数が保持している。
- lcntはMakeList()の値が入った状態で呼ばれる。
- ****************************************************/
- void MakeIndex(int lcnt)
- {
- int i=0;
- LIST *l=NULL;
- char date[8],time[8];
-
- lcnt+=HEADERLINE+1; /* 上下の区切り用ライン */
-
- fwrite(top,1,80,ofp); /* 見出しの最上段 */
- fwrite(line,1,80,ofp); /* 始めの区切り */
- for(l=head.next,i=1;l!=NULL;l=l->next){
- if(l->flag==TRUE){
- l->sline=lcnt;
- fprintf(ofp,"#%03d [%12s] %07d byte %8s %4s (%05d) %05d <---> %05d\n"
- ,i,l->file,l->size,
- GetDateString(l->wr_date,date),GetTimeString(l->wr_time,time)
- ,l->line,l->sline,l->sline+l->line-1);
- lcnt+=l->line;
- i++;
- }
- }
- fwrite(line,1,80,ofp); /* 終わりの区切り */
- }
-
- void Chain(int m)
- {
- LIST *lp;
- char dd[8],tt[5];
- int i,dmy;
-
-
- _dos_setdrive(outfile.drive,(unsigned int *)&dmy);
- if(outfile.path[0] != '\0')
- if (_chdir(outfile.path)==ERR){
- printf("ディレクトリの指定が違います.");
- exit(1);
- }
-
- for(i=1,lp=head.next;lp!=NULL;lp=lp->next){
- if(lp->flag==TRUE){
- fwrite(line,1,80,ofp);
- fprintf(ofp,"(%03d/%03d) %12s %06dbyte %8s %5s %05d line %05d <--> %05d\n"
- ,i++,m,lp->file,lp->size
- ,GetDateString(lp->wr_date,dd),GetTimeString(lp->wr_time,tt)
- ,lp->line,lp->sline,lp->sline+lp->line-1);
- fwrite(lp->bf,1,lp->rsize,ofp);
- fwrite(line,1,80,ofp);
- }
- }
- _dos_setdrive(infile.drive,(unsigned int *)&dmy);
- if(outfile.path[0] != '\0')
- if (_chdir(outfile.path)==ERR){
- printf("ディレクトリの指定が違います.");
- exit(1);
- }
-
- }
-